/**
 * 
 */
package estrategias;

import java.util.Date;

import juegos.*;

/**
 * @author DaNieLooP
 *
 */
public class ProfundidadIterativa implements Estrategia {

	/**
	 * metodo que resuelve un problema por profundidad iterativa.
     * @param nInicial nodo inicial
	 * @param nFinal nodo final
	 * @return nodo al que llegamos
	 */
	public Nodo resuelve(Nodo nInicial,Nodo nFinal) {
		int generados = 1;
		int expandidos = 0;
		Date inicio = new Date();
		int profundidad = 0;
		boolean enc = false;
		Nodo n = null;
		PilaNodos pilaAbiertos = new PilaNodos();
		ListaNodos listaCerrados = new ListaNodos();
		pilaAbiertos.inserta(nInicial);
		while(!enc){
			n = pilaAbiertos.extrae();
			if(n==null){
				profundidad++;
				listaCerrados.vacia();
				pilaAbiertos.inserta(nInicial);
			}else{
				if(n.esFinal()){
					enc = true;
					Date fin = new Date();
					float total = (fin.getTime()-inicio.getTime())/1000f;
					String saux = n.getCamino()+'\n'+"Nodos generados: "+generados+'\n'+"Nodos expandidos: "+expandidos+
					'\n'+"Tiempo transcurrido: "+total+" segundos"+'\n'+"Profundidad: "+n.getProfundidad()+'\n'+"Coste: "+n.getCoste();
					n.setCamino(saux);
				}else if(!listaCerrados.estadoRepetido(n) && n.getProfundidad()<profundidad){
					listaCerrados.inserta(n);
					pilaAbiertos.insertaVector(n.generaHijos());
					expandidos++;
					generados = generados + n.generaHijos().size();
				}
			}
		}
		return n;
	}
	/**
	 * main para probar la estrategia
	 * @param args
	 */
	public static void main(String[] args) {
		NodoHanoi n = new NodoHanoi();
		ProfundidadIterativa p = new ProfundidadIterativa();
		NodoHanoi re = (NodoHanoi) p.resuelve(n,n);
		if(re==null){
			System.out.println("No hay solucion");
		}else
		System.out.println(re.getCamino());
	}

}
